public class Queen8 {

    int[] array = new int[8];
    int max = 8;
    static int count = 0;

    public static void main(String[] args) {
        Queen8 queen8 = new Queen8();
        queen8.check(0);
        System.out.printf("一共有%d种解法",count);

    }

    /**
     * 迭代回溯
     * @param n:皇后个数
     */
    void check(int n){
        //当n == max时，成功排序
        if(n == max) {
            print();
            return;
        }

        for(int i = 0; i < max; i++){
            //第n个皇后的位置的值为i
            array[n] = i;

            //如果第n个皇后符合要求，则进行迭代
            //继续判断下一个皇后符合的位置
            if(judge(n)){
                check(n+1);
            }
        }
    }

    /**
     * 判断n个皇后是否出现在同一行同一列或同一斜线的情况
     * @param n:皇后的个数
     * @return
     */
    boolean judge(int n){
        for(int i = 0; i < n; i++){
            // array[n] == array[i]表示在同一列上
            // Math.abs(n-i) == Math.abs(array[n] - array[i])表示在同一斜线上
            if(array[n] == array[i] || Math.abs(n-i) == Math.abs(array[n] - array[i])){
                return false;
            }
        }
        return true;
    }

    /**
     * 打印出所有可能数组
     */
    void print(){
        count++;
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i] +" ");
        }
        System.out.println();
    }
}
